const Protocol = require('../models/protocol');

// 生成C语言头文件
exports.generateCHeader = async (req, res) => {
  try {
    const protocolId = req.params.id;
    const userId = req.user.id;
    
    // 查找协议
    const protocol = await Protocol.findById(protocolId, userId);
    if (!protocol) {
      return res.status(404).json({ message: '协议不存在或无权访问' });
    }
    
    // 获取协议元素
    const elements = await Protocol.getElements(protocolId);
    
    // 生成头文件内容
    const headerContent = generateCHeaderContent(protocol, elements);
    
    // 返回生成的代码
    res.status(200).json({
      message: '头文件生成成功',
      code: headerContent,
      fileName: `${toCamelCase(protocol.name)}.h`
    });
  } catch (error) {
    console.error('生成头文件失败:', error);
    res.status(500).json({ message: '服务器错误，生成头文件失败' });
  }
};

// 生成C语言源文件
exports.generateCSource = async (req, res) => {
  try {
    const protocolId = req.params.id;
    const userId = req.user.id;
    
    // 查找协议
    const protocol = await Protocol.findById(protocolId, userId);
    if (!protocol) {
      return res.status(404).json({ message: '协议不存在或无权访问' });
    }
    
    // 获取协议元素
    const elements = await Protocol.getElements(protocolId);
    
    // 生成源文件内容
    const sourceContent = generateCSourceContent(protocol, elements);
    
    // 返回生成的代码
    res.status(200).json({
      message: '源文件生成成功',
      code: sourceContent,
      fileName: `${toCamelCase(protocol.name)}.c`
    });
  } catch (error) {
    console.error('生成源文件失败:', error);
    res.status(500).json({ message: '服务器错误，生成源文件失败' });
  }
};

// 生成C语言头文件内容
function generateCHeaderContent(protocol, elements) {
  const protocolName = toCamelCase(protocol.name);
  const structName = `${protocolName}Packet`;
  
  let code = `/**\n`;
  code += ` * @file ${protocolName}.h\n`;
  code += ` * @brief ${protocol.name} 通讯协议头文件\n`;
  code += ` * @details 自动生成的协议头文件\n`;
  code += ` */\n\n`;
  
  code += `#ifndef ${protocolName.toUpperCase()}_H\n`;
  code += `#define ${protocolName.toUpperCase()}_H\n\n`;
  
  code += `#include <stdint.h>\n`;
  code += `#include <stdbool.h>\n`;
  code += `#include <string.h>\n\n`;
  
  // 定义协议结构体
  code += `/**\n`;
  code += ` * @brief ${protocol.name} 协议数据结构\n`;
  code += ` */\n`;
  code += `typedef struct {\n`;
  
  elements.forEach(element => {
    let type;
    let comment = `    /** ${element.name} */\n`;
    
    if (element.element_type === 'fixed') {
      type = 'uint8_t';
      comment = `    /** ${element.name} (固定值: ${element.value}) */\n`;
    } else if (element.element_type === 'normal') {
      switch(element.data_type) {
        case 'uint8': type = 'uint8_t'; break;
        case 'int8': type = 'int8_t'; break;
        case 'uint16': type = 'uint16_t'; break;
        case 'int16': type = 'int16_t'; break;
        case 'float': type = 'float'; break;
        case 'double': type = 'double'; break;
        case 'bits': type = 'uint8_t'; break;
        default: type = 'uint8_t';
      }
    } else if (element.element_type === 'auto') {
      if (element.calc_type === 'length' || element.calc_type === 'checksum') {
        type = 'uint8_t';
      } else if (element.calc_type === 'crc8') {
        type = 'uint8_t';
      } else if (element.calc_type === 'crc16') {
        type = 'uint16_t';
      } else {
        type = 'uint8_t';
      }
      comment = `    /** ${element.name} (${getCalcTypeText(element.calc_type)}) */\n`;
    }
    
    code += comment;
    code += `    ${type} ${element.en_name};\n`;
  });
  
  code += `} ${structName};\n\n`;
  
  // 函数声明
  code += `/**\n`;
  code += ` * @brief 初始化${protocol.name}协议包\n`;
  code += ` * @param packet 协议包指针\n`;
  code += ` * @return 无\n`;
  code += ` */\n`;
  code += `void ${protocolName}_Init(${structName}* packet);\n\n`;
  
  code += `/**\n`;
  code += ` * @brief 计算${protocol.name}协议包长度\n`;
  code += ` * @param packet 协议包指针\n`;
  code += ` * @return 协议包长度(字节)\n`;
  code += ` */\n`;
  code += `uint16_t ${protocolName}_GetLength(const ${structName}* packet);\n\n`;
  
  code += `/**\n`;
  code += ` * @brief 计算${protocol.name}协议包校验值\n`;
  code += ` * @param packet 协议包指针\n`;
  code += ` * @return 校验值\n`;
  code += ` */\n`;
  code += `uint8_t ${protocolName}_CalculateChecksum(const ${structName}* packet);\n\n`;
  
  code += `/**\n`;
  code += ` * @brief 计算${protocol.name}协议包CRC8值\n`;
  code += ` * @param packet 协议包指针\n`;
  code += ` * @return CRC8值\n`;
  code += ` */\n`;
  code += `uint8_t ${protocolName}_CalculateCRC8(const ${structName}* packet);\n\n`;
  
  code += `/**\n`;
  code += ` * @brief 计算${protocol.name}协议包CRC16值\n`;
  code += ` * @param packet 协议包指针\n`;
  code += ` * @return CRC16值\n`;
  code += ` */\n`;
  code += `uint16_t ${protocolName}_CalculateCRC16(const ${structName}* packet);\n\n`;
  
  code += `/**\n`;
  code += ` * @brief 将${protocol.name}协议包序列化为字节数组\n`;
  code += ` * @param packet 协议包指针\n`;
  code += ` * @param buffer 输出缓冲区\n`;
  code += ` * @param bufferSize 缓冲区大小\n`;
  code += ` * @return 实际写入的字节数，失败返回0\n`;
  code += ` */\n`;
  code += `uint16_t ${protocolName}_Serialize(const ${structName}* packet, uint8_t* buffer, uint16_t bufferSize);\n\n`;
  
  code += `/**\n`;
  code += ` * @brief 从字节数组解析${protocol.name}协议包\n`;
  code += ` * @param packet 协议包指针\n`;
  code += ` * @param buffer 输入缓冲区\n`;
  code += ` * @param bufferSize 缓冲区大小\n`;
  code += ` * @return 解析成功返回true，失败返回false\n`;
  code += ` */\n`;
  code += `bool ${protocolName}_Deserialize(${structName}* packet, const uint8_t* buffer, uint16_t bufferSize);\n\n`;
  
  code += `#endif /* ${protocolName.toUpperCase()}_H */\n`;
  
  return code;
}

// 生成C语言源文件内容
function generateCSourceContent(protocol, elements) {
  const protocolName = toCamelCase(protocol.name);
  const structName = `${protocolName}Packet`;
  
  let code = `/**\n`;
  code += ` * @file ${protocolName}.c\n`;
  code += ` * @brief ${protocol.name} 通讯协议源文件\n`;
  code += ` * @details 自动生成的协议源文件\n`;
  code += ` */\n\n`;
  
  code += `#include "${protocolName}.h"\n\n`;
  
  // CRC表定义
  code += `// CRC8查表法\n`;
  code += `static const uint8_t crc8_table[256] = {\n`;
  code += `    0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,\n`;
  code += `    0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,\n`;
  code += `    0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,\n`;
  code += `    0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,\n`;
  code += `    0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,\n`;
  code += `    0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,\n`;
  code += `    0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,\n`;
  code += `    0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,\n`;
  code += `    0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,\n`;
  code += `    0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,\n`;
  code += `    0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,\n`;
  code += `    0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,\n`;
  code += `    0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,\n`;
  code += `    0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,\n`;
  code += `    0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,\n`;
  code += `    0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3\n`;
  code += `};\n\n`;
  
  code += `// CRC16查表法\n`;
  code += `static const uint16_t crc16_table[256] = {\n`;
  code += `    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\n`;
  code += `    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\n`;
  code += `    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\n`;
  code += `    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\n`;
  code += `    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\n`;
  code += `    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,\n`;
  code += `    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,\n`;
  code += `    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,\n`;
  code += `    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,\n`;
  code += `    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n`;
  code += `    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n`;
  code += `    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\n`;
  code += `    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\n`;
  code += `    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\n`;
  code += `    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\n`;
  code += `    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\n`;
  code += `};\n\n`;
  
  // 初始化函数
  code += `void ${protocolName}_Init(${structName}* packet) {\n`;
  code += `    if (packet == NULL) return;\n`;
  code += `    \n`;
  code += `    memset(packet, 0, sizeof(${structName}));\n`;
  
  // 设置固定值
  elements.forEach(element => {
    if (element.element_type === 'fixed') {
      code += `    packet->${element.en_name} = ${element.value};\n`;
    }
  });
  
  code += `}\n\n`;
  
  // 获取长度函数
  code += `uint16_t ${protocolName}_GetLength(const ${structName}* packet) {\n`;
  code += `    if (packet == NULL) return 0;\n`;
  code += `    \n`;
  code += `    return sizeof(${structName});\n`;
  code += `}\n\n`;
  
  // 计算校验和函数
  code += `uint8_t ${protocolName}_CalculateChecksum(const ${structName}* packet) {\n`;
  code += `    if (packet == NULL) return 0;\n`;
  code += `    \n`;
  code += `    uint8_t checksum = 0;\n`;
  code += `    const uint8_t* data = (const uint8_t*)packet;\n`;
  code += `    uint16_t length = sizeof(${structName});\n`;
  
  // 查找校验和字段的位置
  let checksumOffset = 0;
  elements.forEach((element, index) => {
    if (element.element_type === 'auto' && element.calc_type === 'checksum') {
      // 计算校验和字段的偏移量
      let offset = 0;
      for (let i = 0; i < index; i++) {
        if (elements[i].element_type === 'normal') {
          switch(elements[i].data_type) {
            case 'uint8': case 'int8': offset += 1; break;
            case 'uint16': case 'int16': offset += 2; break;
            case 'float': offset += 4; break;
            case 'double': offset += 8; break;
            case 'bits': offset += 1; break;
            default: offset += 1;
          }
        } else {
          offset += 1; // 固定类型和其他自动类型都是1字节
        }
      }
      checksumOffset = offset;
    }
  });
  
  code += `    \n`;
  code += `    // 跳过校验和字段本身\n`;
  code += `    for (uint16_t i = 0; i < length; i++) {\n`;
  code += `        if (i != ${checksumOffset}) {\n`;
  code += `            checksum += data[i];\n`;
  code += `        }\n`;
  code += `    }\n`;
  code += `    \n`;
  code += `    return checksum;\n`;
  code += `}\n\n`;
  
  // 计算CRC8函数
  code += `uint8_t ${protocolName}_CalculateCRC8(const ${structName}* packet) {\n`;
  code += `    if (packet == NULL) return 0;\n`;
  code += `    \n`;
  code += `    uint8_t crc = 0;\n`;
  code += `    const uint8_t* data = (const uint8_t*)packet;\n`;
  code += `    uint16_t length = sizeof(${structName});\n`;
  
  // 查找CRC8字段的位置
  let crc8Offset = 0;
  elements.forEach((element, index) => {
    if (element.element_type === 'auto' && element.calc_type === 'crc8') {
      // 计算CRC8字段的偏移量
      let offset = 0;
      for (let i = 0; i < index; i++) {
        if (elements[i].element_type === 'normal') {
          switch(elements[i].data_type) {
            case 'uint8': case 'int8': offset += 1; break;
            case 'uint16': case 'int16': offset += 2; break;
            case 'float': offset += 4; break;
            case 'double': offset += 8; break;
            case 'bits': offset += 1; break;
            default: offset += 1;
          }
        } else {
          offset += 1; // 固定类型和其他自动类型都是1字节
        }
      }
      crc8Offset = offset;
    }
  });
  
  code += `    \n`;
  code += `    // 跳过CRC8字段本身\n`;
  code += `    for (uint16_t i = 0; i < length; i++) {\n`;
  code += `        if (i != ${crc8Offset}) {\n`;
  code += `            crc = crc8_table[crc ^ data[i]];\n`;
  code += `        }\n`;
  code += `    }\n`;
  code += `    \n`;
  code += `    return crc;\n`;
  code += `}\n\n`;
  
  // 计算CRC16函数
  code += `uint16_t ${protocolName}_CalculateCRC16(const ${structName}* packet) {\n`;
  code += `    if (packet == NULL) return 0;\n`;
  code += `    \n`;
  code += `    uint16_t crc = 0xFFFF;\n`;
  code += `    const uint8_t* data = (const uint8_t*)packet;\n`;
  code += `    uint16_t length = sizeof(${structName});\n`;
  
  // 查找CRC16字段的位置
  let crc16Offset = 0;
  let crc16Size = 2;
  elements.forEach((element, index) => {
    if (element.element_type === 'auto' && element.calc_type === 'crc16') {
      // 计算CRC16字段的偏移量
      let offset = 0;
      for (let i = 0; i < index; i++) {
        if (elements[i].element_type === 'normal') {
          switch(elements[i].data_type) {
            case 'uint8': case 'int8': offset += 1; break;
            case 'uint16': case 'int16': offset += 2; break;
            case 'float': offset += 4; break;
            case 'double': offset += 8; break;
            case 'bits': offset += 1; break;
            default: offset += 1;
          }
        } else if (elements[i].element_type === 'auto' && elements[i].calc_type === 'crc16') {
          offset += 2;
        } else {
          offset += 1; // 固定类型和其他自动类型都是1字节
        }
      }
      crc16Offset = offset;
    }
  });
  
  code += `    \n`;
  code += `    // 跳过CRC16字段本身\n`;
  code += `    for (uint16_t i = 0; i < length; i++) {\n`;
  code += `        if (i < ${crc16Offset} || i >= ${crc16Offset + crc16Size}) {\n`;
  code += `            crc = (crc << 8) ^ crc16_table[(crc >> 8) ^ data[i]];\n`;
  code += `        }\n`;
  code += `    }\n`;
  code += `    \n`;
  code += `    return crc;\n`;
  code += `}\n\n`;
  
  // 序列化函数
  code += `uint16_t ${protocolName}_Serialize(const ${structName}* packet, uint8_t* buffer, uint16_t bufferSize) {\n`;
  code += `    if (packet == NULL || buffer == NULL) return 0;\n`;
  code += `    \n`;
  code += `    uint16_t packetSize = sizeof(${structName});\n`;
  code += `    if (bufferSize < packetSize) return 0;\n`;
  code += `    \n`;
  code += `    // 创建临时副本，用于计算自动字段\n`;
  code += `    ${structName} tempPacket = *packet;\n`;
  
  // 计算自动字段
  elements.forEach(element => {
    if (element.element_type === 'auto') {
      if (element.calc_type === 'length') {
        code += `    tempPacket.${element.en_name} = ${protocolName}_GetLength(&tempPacket);\n`;
      } else if (element.calc_type === 'checksum') {
        code += `    tempPacket.${element.en_name} = ${protocolName}_CalculateChecksum(&tempPacket);\n`;
      } else if (element.calc_type === 'crc8') {
        code += `    tempPacket.${element.en_name} = ${protocolName}_CalculateCRC8(&tempPacket);\n`;
      } else if (element.calc_type === 'crc16') {
        code += `    tempPacket.${element.en_name} = ${protocolName}_CalculateCRC16(&tempPacket);\n`;
      }
    }
  });
  
  code += `    \n`;
  code += `    // 复制数据到缓冲区\n`;
  code += `    memcpy(buffer, &tempPacket, packetSize);\n`;
  code += `    \n`;
  code += `    return packetSize;\n`;
  code += `}\n\n`;
  
  // 反序列化函数
  code += `bool ${protocolName}_Deserialize(${structName}* packet, const uint8_t* buffer, uint16_t bufferSize) {\n`;
  code += `    if (packet == NULL || buffer == NULL) return false;\n`;
  code += `    \n`;
  code += `    uint16_t packetSize = sizeof(${structName});\n`;
  code += `    if (bufferSize < packetSize) return false;\n`;
  code += `    \n`;
  code += `    // 复制数据到结构体\n`;
  code += `    memcpy(packet, buffer, packetSize);\n`;
  code += `    \n`;
  code += `    // 验证固定字段\n`;
  let hasFixedFields = false;
  elements.forEach(element => {
    if (element.element_type === 'fixed') {
      hasFixedFields = true;
      code += `    if (packet->${element.en_name} != ${element.value}) return false;\n`;
    }
  });
  
  // 验证自动字段
  let hasAutoFields = false;
  elements.forEach(element => {
    if (element.element_type === 'auto') {
      hasAutoFields = true;
      if (element.calc_type === 'checksum') {
        code += `    uint8_t calculatedChecksum = ${protocolName}_CalculateChecksum(packet);\n`;
        code += `    if (packet->${element.en_name} != calculatedChecksum) return false;\n`;
      } else if (element.calc_type === 'crc8') {
        code += `    uint8_t calculatedCRC8 = ${protocolName}_CalculateCRC8(packet);\n`;
        code += `    if (packet->${element.en_name} != calculatedCRC8) return false;\n`;
      } else if (element.calc_type === 'crc16') {
        code += `    uint16_t calculatedCRC16 = ${protocolName}_CalculateCRC16(packet);\n`;
        code += `    if (packet->${element.en_name} != calculatedCRC16) return false;\n`;
      }
    }
  });
  
  if (!hasFixedFields && !hasAutoFields) {
    code += `    // 没有固定字段或自动字段需要验证\n`;
  }
  
  code += `    \n`;
  code += `    return true;\n`;
  code += `}\n`;
  
  return code;
}

// 获取计算类型文本
function getCalcTypeText(type) {
  const types = {
    'length': '长度计算',
    'checksum': '校验和',
    'crc8': 'CRC8',
    'crc16': 'CRC16'
  };
  return types[type] || type;
}

// 转换为驼峰命名
function toCamelCase(str) {
  return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) {
    if (+match === 0) return "";
    return index === 0 ? match.toLowerCase() : match.toUpperCase();
  }).replace(/[^\w]/g, '');
}

module.exports = {
  generateCHeader,
  generateCSource
};
